package model;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import ar.edu.unq.tpi.pconc.Channel;

public class Castillo extends Thread implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 4186677612132050305L;
	private String color;
	private Ciudad ciudad;
	private List<Unidad> unidades = new ArrayList<Unidad>();
	
	public Castillo(String color, Ciudad unaCiudad) {
		this.color = color;
		this.setCiudad(unaCiudad);
		this.getCiudad().setCastillo(this);
		this.log("Creado en la ciudad: " + this.getCiudad());
	}
	
	@Override
	public String toString() {
		return "Castillo " + this.color;
	}
	
	@Override
	public void run() {
		this.crearUnidad();
		Channel<Mensaje> canal = new Channel<Mensaje>(this.getCanal());
		while (!Mapa.gameOver()) {
			switch(canal.receive()){
				case UNIDAD_MUERTA:
					this.log("Debo crear una nueva unidad.");
					this.crearUnidad();
					break;
			}
		}
		// Se termino la ejecución.
		this.log("*** EJECUCION FINALIZADA ***");
		// Como finalizo el juego procedo a enviar un mensaje para que finalicen todos las unidades que quedaron vivas.
		
		//this.matarUnidades(); // PROXIMAMENTE
	}

	public int getCanal() {
		if(this.getColor() == "gold"){
			return 2000;
		}
		return 3000;
	}

	private void log(String string) {
		System.out.println("[" + this + "] ("+this.getCanal()+"): " + string);
	}
	
	/**
	 * Envio el mensaje desde la copia al Thread.
	 */
	public void msgCrearUnidad()
	{
		Channel<Mensaje> canal = new Channel<Mensaje>(this.getCanal());
		canal.send(Mensaje.UNIDAD_MUERTA);
	}

	/**
	 * Ejecuto la creación de una nueva unidad.
	 */
	private void crearUnidad() {
		int identificador = this.getUnidades().size() + 1;
		Unidad unaUnidad = new Unidad(this, identificador );
		this.getCiudad().setUnidadActual(unaUnidad);
		this.getUnidades().add(unaUnidad);
		unaUnidad.start();
	}

	// Getters y Setters
	
	public Ciudad getCiudad() {
		return ciudad;
	}

	public void setCiudad(Ciudad ciudad) {
		this.ciudad = ciudad;
	}

	public String getColor() {
		return this.color;
	}

	public List<Unidad> getUnidades() {
		return unidades;
	}

	public void setUnidades(List<Unidad> unidades) {
		this.unidades = unidades;
	}
	
	enum Mensaje {
		UNIDAD_MUERTA
	}
	
}
